Key

scroll

Key Blog

  • Key 主頁>
  • 博客>
  • [ue5] 有助於記憶體優化的工具、命令及優化方法
  • [UE5] 有助於記憶體優化的工具、命令及優化方法

    @kiikey4(Key Zhao)

    [UE5] 有助於記憶體優化的工具、命令及優化方法

    發佈日期 2024年12月17日

    0

    概述

    在本文的前半部分,我們介紹了在 Unreal Engine (UE) 中進行記憶體優化的有用命令和工具。後半部分將解釋如何使用這些命令和工具來優化 UE 中的記憶體。
    提供了大量的參考文章和視頻,將它們與本文結合,將加深你的理解。

    環境

    • Unreal Engine 5.4

    主要內容

    記憶體優化的目的

    • 性能提升
      高效的記憶體管理能提高幀率和整體遊戲性能。
    • 解決記憶體不足導致的崩潰
    • 縮短載入時間
      優化的材質和資源能縮短載入時間。

    有用的 UE 記憶體管理命令和工具

    stat memory

    • 命令: stat memory
      顯示按類型分類的當前記憶體使用情況。

    StatMemory_t1z2t8

    Memreport

    • 命令: memreport -full
      將記憶體報告保存為轉儲文件。
    • 命令: memreport -log
      在日誌中顯示記憶體報告。

    Memreport 參考資料:

    Qiita: 使用 Memreport 調查記憶體洩漏原因 (ja)
    Ari's Unreal Engine Notes: Debugging Memory Leaks
    [UE4] 使用 Memreport! (ja)

    Memreport 範例

    1. 顯示總記憶體使用情況

      • 在轉儲文件中搜尋 "Physical Memory" 來找到此資訊。
        image_zwpbqj
    2. 列出按記憶體使用量排序的材質 (降序)

      • 在轉儲文件中搜尋 "listtextures" 來查看此數據。
        image_qfkujl

    物件列表命令

    • 命令: obj list
      列出當前存在的物件。
    • 命令: obj list name=
      按名稱搜尋物件。
    • 命令: obj refs name=
      顯示按名稱查找物件的參考。

    物件列表參考文章:

    [UE4] 使用 Obj 命令分析物件

    物件列表如下圖所示 image_ad9wgh

    垃圾回收 (GC) 命令

    • 命令: obj gc
      執行一次垃圾回收。
    • 命令: gc.ForceCollectGarbageEveryFrame 1
      強制每幀進行垃圾回收。
    • 命令: gc.ForceCollectGarbageEveryFrame 0
      停止每幀強制垃圾回收。

    通過垃圾回收 (GC) 可以釋放資源或檢查參考。

    每幀強制垃圾回收可能會導致遊戲運行緩慢,因此建議僅在調查目的下使用。

    GC 參考資料:

    什麼是 GC?: 官方文檔: Unreal Engine 中的物件處理

    【UE5】強制執行垃圾回收操作 (ja)

    【UE4】關於 UObject 的 PendingKill | HEXADRIVE (ja)

    低級記憶體追蹤器 (LLM)

    • 命令: stat llm
      使用低級記憶體追蹤器追蹤記憶體使用情況。

    更多詳情,請參考以下參考資料。

    LLM 參考資料:

    官方文檔: 在 Unreal Engine 中使用低級記憶體追蹤器

    [UE4] 使用 LLM (低級記憶體追蹤器) 進行記憶體追蹤 (ja)

    參考查看器 (Reference Viewer)

    這個工具顯示了被其他資源參考或參考其他資源的資源圖。
    你可以通過右鍵單擊 UE 中的資源並選擇 "Reference Viewer" 來使用它。
    當不應該加載的資源意外加載時,這對於調查非常有用。

    官方文檔: Unreal Engine 中的參考查看器

    image_doxlqp

    尺寸地圖 (Size Map)

    右鍵單擊 UE 中的資源 -> "Size Map" -> 在右上角選擇 "Memory"。

    顯示所有參考資源的總記憶體使用情況。

    尺寸地圖參考:

    視頻: 如何優化 Unreal Engine 5 遊戲中的記憶體使用

    image_tflhtf

    記憶體洞察 (Memory Insight)

    • 用於分析隨時間變化的記憶體分配和釋放。 範例: 時間 A -> 時間 B 記憶體分配 123.456MB

    記憶體洞察參考:

    Qiita: 使用 UE4 記憶體洞察進行記憶體追蹤 (ja)

    官方文檔: Unreal Engine 中的記憶體洞察

    記憶體洞察範例,調查記憶體洩漏視頻 (34:38): Maximizing Your Game's Performance in Unreal Engine | Unreal Fest 2022

    image_tjggde

    記憶體調查和優化方法

    記憶體優化流程通常遵循以下步驟:

    MemOptimizationFlow_en_xmleen

    識別記憶體問題
    查找崩潰日誌或記憶體警告。

    LowMemoryWarning_ja_udacd1

    收集數據
    使用如 stat memorymemreport、記憶體洞察等工具,或使用 UE 以外的分析工具來調查記憶體使用情況:

    • 永遠在真實設備或打包版本中進行調查。
      • 在 PIE 模式下,預加載的緩存和背景操作可能會影響測量,使準確結果變得困難。
    • 記憶體使用情況會因設備而異。
    檢查總記憶體使用情況

    要檢查整體記憶體使用情況,最好確保至少有 500MB 的物理記憶體可用。

    使用 memreport -full 進行檢查:

    • Memreport 的一部分: 顯示總體記憶體使用情況。
      • 在轉儲文件中搜尋 "Physical Memory" 來找到此資訊。 image_zwpbqj
    檢查材質記憶體使用情況

    你可以通過顯示 listtextures nonvt 報告(按大小排序)來檢查材質的記憶體使用情況。

    使用 memreport -full 進行檢查:

    • Memreport 的一部分: 顯示按記憶體使用量降序排列的材質。
      • 在轉儲文件中搜尋 "listtextures" 來找到此資訊。 image_qfkujl

    分析數據
    識別高記憶體使用的資源 (如材質)。 調查不必要或過大資源

    要調查是否加載了不必要的資源:

    使用命令 obj list name= 根據名稱搜尋資源並檢查它是否已經加載。 範例: obj list name=T_SomeTexture

    使用命令 obj refs name= 顯示哪些物件正在參考給定的資源,幫助你識別為什麼它會被加載。 範例: obj refs name=T_SomeTexture

    此外,你可以使用參考查看器進一步追蹤參考的來源,並調查硬參考是如何被創建的。

    有關硬參考和軟參考的更多信息:

    硬參考和軟參考 (ja)

    在 BP 中打破參考鏈的方法 (ja)

    提出改進措施

    • 刪除不必要的資源
    • 使用低解析度的紋理
    • 合併或壓縮大文件

    實施改進措施
    修正有問題的資源或防止其被加載。

    • 刪除不必要的資源:
      • 移除硬參考。
    • 釋放不再使用的資源:
      • 將硬參考轉為軟參考,並在應該釋放時將其設置為 nullptr,這樣它們會在下一次垃圾回收時被釋放。
    • 使用低解析度的紋理或調整壓縮設置。
    • 根據需要進行其他調整。

    驗證
    通過 memreport 比較優化前後的內存使用情況。

    如何檢查有問題的資源是否不再加載

    可以使用 gc.ForceCollectGarbageEveryFrame 1obj gc 強制進行垃圾回收。
    當資源不再被引用(對於軟參考設置 nullptr)時,可以強制進行垃圾回收。然後,使用 obj list name= 檢查資源是否仍然加載。如果它仍然加載,則意味著仍有引用,您應該再次進行數據分析。

    比較內存使用變化

    使用 memreport -fullmemreport -log 指令來檢查整體內存使用情況,並比較優化或調整前後的差異。

    內存優化的關鍵要點

    • 培養防止內存洩漏的習慣,確保資源能夠正確釋放。
    • 小心硬參考,它們可能會加載所有引用的對象。
    • 適當使用軟參考。
    • 持續監控內存使用情況,以進行改進。

    總結

    • 內存優化的重要性
      旨在提高性能、縮短加載時間,並防止內存崩潰。
    • 有用的命令和工具
      • stat memory
      • memreport -logmemreport -full
      • obj listobj refs name=
      • obj gcgc.ForceCollectGarbageEveryFrame
      • LLM
      • 參考查看器
      • 尺寸地圖
      • 內存洞察工具
    • 優化過程
      識別問題、收集數據、分析、提出改進、實施修復並驗證。
    優化措施範例
    • 刪除不必要的資源或防止其被加載
    • 使用低解析度的紋理或調整壓縮設置
    • 根據數據分析進行其他調整

    希望本文能在您遇到內存不足導致崩潰時提供幫助。
    如果有任何錯誤,請在評論中告訴我,我會進行修正。

    參考資料

    0

    評論

    沒有評論

    發表閣下的感受